/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jogocartas.servidor;

/**
 *
 * @author sota
 */
import java.io.*;
import java.net.*;
import java.util.*;

class WebServer {

    public static void main(String argv[]) throws Exception {
        {
            String requestMessageLine;
            String fileName;
            // abre um socket servidor para escutar na porta 6789  
            ServerSocket listenSocket = new ServerSocket(6789);
            // pára aqui e fica aguardando conexão de algum cliente  
            Socket connectionsoquet = listenSocket.accept();
            // recebeu conexão  
            // obtem o stream para receber dados do cliente  
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionsoquet.getInputStream()));
            // obtem o stream para escrever para o cliente  
            DataOutputStream outToClient = new DataOutputStream(connectionsoquet.getOutputStream());
            // recebe a instrucao de requisicao do cliente  
            requestMessageLine = inFromClient.readLine();
            // separa a requisicao em partes (separadas por espaco)  
            StringTokenizer tokenizedLine = new StringTokenizer(requestMessageLine);
            // se o primeiro pedaco for 'Get' o nome do arquivo recebe o pedaco seguinte  
            if (tokenizedLine.nextToken().equals("Get")) {
                fileName = tokenizedLine.nextToken();
                // se o nome do arquivo comecar com '/', retira a barra  
                if (fileName.startsWith("/")) {
                    fileName = fileName.substring(1);
                }
                // abre o arquivo local  
                File file = new File(fileName);
                // lê o tamanho do arquivo  
                int numOfBytes = (int) file.length();
                // lê o arquivo de uma vez para a memoria  
                FileInputStream inFile = new FileInputStream(fileName);
                byte[] fileInBytes = new byte[numOfBytes];
                inFile.read(fileInBytes);
                // escreve o cabecalho da resposta para o cliente  
                outToClient.writeBytes("HTTP/1.0 200 Document Follows\r\n");
                // verifica a extensão do documento e ajusta o content-type da resposta           
                if (fileName.endsWith(".jpg")) {
                    outToClient.writeBytes("Content-Type: image/jpeg\r\n");
                }
                if (fileName.endsWith(".gif")) {
                    outToClient.writeBytes("Content-Type: image/gif\r\n");
                }
                // escreve todo o conteúdo do arquivo local na resposta  
                outToClient.writeBytes("\r\n");
                outToClient.write(fileInBytes, 0, numOfBytes);
                outToClient.flush();
                // fecha a conexao com o cliente  
                connectionsoquet.close();
            } else {
                // não sendo um 'Get' escreve a msg na saida padrao  
                System.out.println("Bad Request Message");
            }
        }
    }
}